<?php

/**
 * 中国时区
 */

use yii\log\FileTarget;
use yii\web\Response;

ini_set('date.timezone', 'Asia/Shanghai');

/**
 * 时间戳全局变量
 */
defined('GTIME') or define('GTIME', time());

if (!function_exists('paramsFilter')) {
    /**
     * 参数过滤
     * @param $params
     * @return mixed
     */
    function paramsFilter(&$params)
    {
        foreach ($params as $key => $paramItem) {
            if (!is_array($params[$key])) {
                $params[$key] = htmlspecialchars(trim($params[$key]), ENT_QUOTES);
            } else {
                paramsFilter($params[$key]);
            }
        }
        return $params;
    }
}

if (!function_exists('specialChar')) {
    /**
     * 特殊字符
     * @return string
     */
    function specialChar()
    {
        return "/[`~!@#$%^&*()_\-+=<>?:\"{}|,.\/;'\\[\]·~！@#￥%……&*（）——\-+={}|《》？：“”【】、；‘'，。、]|select|insert|update|CR|document|LF|eval|delete|script|alert|union|into|load_file|outfile/im";
    }
}

/**
 * 带前缀URL
 */
if (!function_exists('getPreUrl')) {

    function getPreUrl($path = '/')
    {
        $pre = 'http://';
        if (env('APP_SSL')) {
            $pre = 'https://';
        }
        if ($path === '/') {
            return $pre . domain();
        }
        return $pre . domain() . $path;
    }

}

/**
 * 前台URL函数
 */
if (!function_exists('url')) {

    function url($path = '/', $fromUrl = '')
    {
        if ($fromUrl == '') {
            return getPreUrl($path);
        }
        $prase = parse_url($path);
        $query = [];
        if (array_key_exists('query', $prase)) {
            parse_str($prase['query'], $query);
        }
        if ($fromUrl == 'location') {
            $query['fromUrl'] = urlencode(Yii::$app->request->url);
        } else {
            $query['fromUrl'] = $fromUrl;
        }
        return getPreUrl($prase['path'] . '?' . http_build_query($query));
    }

}

/**
 * 后台URL函数
 */
if (!function_exists('urlA')) {

    function urlA($path = "/", $fromUrl = '')
    {
        $path = '/admincp' . $path;
        if ($fromUrl == '') {
            return url($path);
        }
        $prase = parse_url($path);
        $query = [];
        if (array_key_exists('query', $prase)) {
            parse_str($prase['query'], $query);
        }
        if ($fromUrl == 'location') {
            $query['fromUrl'] = urlencode(Yii::$app->request->url);
        } else {
            $query['fromUrl'] = $fromUrl;
        }
        return url($prase['path'] . '?' . http_build_query($query));
    }

}

/**
 * 加载配置文件
 */
if (!function_exists('loadConfig')) {

    function loadConfig($fileName)
    {
        return require \Yii::getAlias('@common') . '/config/' . $fileName . '.php';
    }

}

/**
 * dd调试函数
 * @param type $var
 */
if (!function_exists('dd')) {

    function dd($var)
    {
        if ($var === null) {
            exit('null');
        }
        if (is_bool($var)) {
            if ($var == true) {
                exit('true');
            } else {
                exit('false');
            }
        } else {
            echo '<pre>';
            print_r($var);
            echo '</pre>';
            exit();
        }
    }

}

/**
 * 打印函数
 */
if (!function_exists('dump')) {
    function dump($var, $exit = false)
    {
        echo '<pre>';
        print_r($var);
        echo '</pre>';
        if ($exit) {
            die ();
        }
    }
}

/**
 * 数组返回
 */
if (!function_exists('arrayReturn')) {

    function arrayReturn($code = 1, $msg = 'success', $data = [])
    {
        return [
            'code' => $code,
            'msg' => $msg,
            'data' => $data
        ];
    }

}


/**
 * 请勿使用此函数
 */
if (!function_exists('ajaxReturn')) {

    function ajaxReturn($errno = 1, $errmsg = 'success', $data = [])
    {
        return [
            'errno' => $errno,
            'errmsg' => $errmsg,
            'data' => $data
        ];
    }

}


/**
 * 成功状态数组
 */
if (!function_exists('ajaxReturnSuccess')) {

    function ajaxReturnSuccess($code = 1, $errmsg = 'success', $data = [])
    {
        return ajaxReturn($code, $errmsg, $data);
    }

}

/**
 * 失败状态数组
 */
if (!function_exists('ajaxReturnFailure')) {

    function ajaxReturnFailure($errmsg = 'success', $data = array())
    {
        return ajaxReturn(0, $errmsg, $data);
    }

}

/**
 * 接口返回数据
 */
if (!function_exists('returnJsonData')) {
    function returnJsonData($msg = '', $data = [])
    {
        return json_encode([
            'code' => 200,
            'msg' => $msg,
            'data' => $data
        ]);
    }
}


/**
 * 将ip地址转换为正整型
 */
if (!function_exists('ip2StrLong')) {

    function ip2StrLong($ip)
    {
        return sprintf("%u", ip2long($ip));
    }

}

/**
 * 将正整型转换为ip地址
 */
if (!function_exists('long2ipStr')) {

    function long2ipStr($data)
    {
        return long2ip($data);
    }

}

/**
 * 请勿使用此函数
 */
if (!function_exists('param')) {

    function param($key = '', $default = '', $methd = 'any')
    {
        if ($methd == 'get' || $methd == 'GET') {
            return Yii::$app->request->get($key, $default);
        }
        if ($methd == 'post' || $methd == 'POST') {
            return Yii::$app->request->post($key, $default);
        }
        $param = array_merge(Yii::$app->request->get(), Yii::$app->request->post());
        if ($key == '') {
            return $param;
        }
        if (!array_key_exists($key, $param)) {
            return $default ? $default : null;
        }
        return $param[$key];
    }

}

/**
 * 获取post参数
 */
if (!function_exists('post')) {

    function post($key = '', $default = '')
    {
        if (!$key) {
            return Yii::$app->request->post();
        }
        $rtn = Yii::$app->request->post($key, $default);
        if (!is_array($rtn)) {
            return trim($rtn);
        }
        return $rtn;
    }

}

/**
 * 获取get参数
 */
if (!function_exists('get')) {

    function get($key = '', $default = '')
    {
        if (!$key) {
            return Yii::$app->request->get();
        }
        $rtn = Yii::$app->request->get($key, $default);
        if (!is_array($rtn)) {
            return trim($rtn);
        }
        return $rtn;
    }

}

/**
 * 获取post参数
 */
if (!function_exists('get')) {

    function get($key = '', $default = '')
    {
        if (!$key) {
            return Yii::$app->request->get();
        }
        $rtn = Yii::$app->request->get($key, $default);
        if (!is_array($rtn)) {
            return trim($rtn);
        }
        return $rtn;
    }

}

/**
 * 获取默认session信息
 */
if (!function_exists('getSession')) {

    function getSession($key = '', $default = '')
    {
        if (!$key) {
            return Yii::$app->session->get('');
        }
        $rtn = Yii::$app->session->get($key, $default);
        if (!is_array($rtn)) {
            return trim($rtn);
        }
        return $rtn;
    }

}

/**
 * 获取Cache信息
 */
if (!function_exists('getCache')) {

    function getCache($key = '', $default = '')
    {
        if (!$key) {
            return Yii::$app->cache->get();
        }
        $rtn = Yii::$app->cache->get($key, $default);
        if (!is_array($rtn)) {
            return trim($rtn);
        }
        return $rtn;
    }

}


/**
 * 设置Cache信息
 */
if (!function_exists('setCache')) {

    function setCache($key = '', $default = '', $expire = 0)
    {
        return Yii::$app->cache->set($key, $default, $expire);
    }

}

/**
 * 清空Cache信息
 */
if (!function_exists('clearCache')) {

    function clearCache($key = '')
    {
        if ($key) {
            return Yii::$app->cache->delete($key);

        }
        return Yii::$app->cache->flush();
    }

}

/**
 * 加载环境变量
 * @author df
 */
if (!function_exists('loadEnvConfig')) {

    function loadEnvConfig()
    {
        $envPath = dirname(dirname(dirname(__FILE__))) . '/.env';
        if (!file_exists($envPath)) {
            return;
        }
        $string = file_get_contents($envPath);
        if (!$string) {
            return;
        }
        $arr = explode("\n", $string);
        if (!count($arr)) {
            return;
        }
        foreach ($arr as $val) {
            if (!$val) {
                continue;
            }
            putenv($val);
        }
    }

}

//直接加载
loadEnvConfig();

/**
 * 读取value
 * @author df
 */
if (!function_exists('value')) {

    function value($value)
    {
        return $value instanceof Closure ? $value() : $value;
    }

}

/**
 * 读取环境变量
 * @author df
 */
if (!function_exists('env')) {

    function env($key, $default = null)
    {
        $value = getenv($key);
        if ($value === false) {
            return value($default);
        }
        $value = str_replace("\r", "", str_replace("\n", "", $value));
        switch (strtolower($value)) {
            case 'true':
            case '(true)':
                return true;

            case 'false':
            case '(false)':
                return false;

            case 'empty':
            case '(empty)':
                return '';

            case 'null':
            case '(null)':
                return;
        }
        return $value;
    }

}

/**
 * 循环创建目录创建目录 递归创建多级目录
 * @param string $dir
 * @param string $mode
 */
if (!function_exists("CreateFolder")) {

    function CreateFolder($dir, $mode = 0777)
    {
        if (is_dir($dir) || @mkdir($dir, $mode))
            return true;
        if (!CreateFolder(dirname($dir), $mode))
            return false;
        return @mkdir($dir, $mode);
    }

}

/**
 * 写日志
 * $file 是 保存的日志名称
 * file = game 或者 game-debug
 * 请勿自定义文件名称
 */
if (!function_exists("writeLog")) {

    function writeLog($log, $file = 'out')
    {
        #生产环境写消息队列
        $dir = Yii::getAlias('@rootPath') . '/out/';
        if (YII_ENV_DEV || 1) {
            CreateFolder($dir);
            $of = @fopen($dir . "{$file}-" . date("Y-m-d-H") . ".txt", 'a+');
            @fwrite($of, $log . '-----------' . date("Y-m-d H:i:s", GTIME) . "\r\n");
            @fclose($of);
        } else {
            SeaslogHelper::send($file, $log . "\r\n");
        }
    }

}

/**
 * null 字符串处理
 */
if (!function_exists('changeNull')) {

    function changeNull(&$string, $tores = '')
    {
        $string = !is_null($string) ? $string : '';
    }

}

/**
 * 判断是否是post
 */
if (!function_exists('isPost')) {

    function isPost()
    {
        return isset($_SERVER['REQUEST_METHOD']) && strtoupper($_SERVER['REQUEST_METHOD']) == 'POST' ? true : false;
    }
}

/**
 * 将二维数组转为一维数组，以键值作为一维数组的键值，值则取二维数组中第一个的值
 */
if (!function_exists("tdArrToArr")) {
    function tdArrToArr($tdArr)
    {
        $arr = [];
        foreach ($tdArr as $key => $value) {
            $arr[] = $value[0];
        }
        return reset($arr);
    }
}

/**
 * 检查是否身份证号
 * @author woniu 20200330
 */
if (!function_exists('checkIdcard')) {

    function checkIdcard($id)
    {
        $id = strtoupper($id);
        $regx = "/(^\d{15}$)|(^\d{17}([0-9]|X)$)/";
        $arr_split = array();
        if (!preg_match($regx, $id)) {
            return FALSE;
        }
        if (15 == strlen($id)) { //检查15位
            $regx = "/^(\d{6})+(\d{2})+(\d{2})+(\d{2})+(\d{3})$/";

            @preg_match($regx, $id, $arr_split);
            //检查生日日期是否正确
            $dtm_birth = "19" . $arr_split[2] . '/' . $arr_split[3] . '/' . $arr_split[4];
            if (!strtotime($dtm_birth)) {
                return FALSE;
            } else {
                return TRUE;
            }
        } else {      //检查18位
            $regx = "/^(\d{6})+(\d{4})+(\d{2})+(\d{2})+(\d{3})([0-9]|X)$/";
            @preg_match($regx, $id, $arr_split);
            $dtm_birth = $arr_split[2] . '/' . $arr_split[3] . '/' . $arr_split[4];
            if (!strtotime($dtm_birth)) { //检查生日日期是否正确
                return FALSE;
            } else {
                //检验18位身份证的校验码是否正确。
                //校验位按照ISO 7064:1983.MOD 11-2的规定生成，X可以认为是数字10。
                $arr_int = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
                $arr_ch = array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
                $sign = 0;
                for ($i = 0; $i < 17; $i++) {
                    $b = (int)$id{$i};
                    $w = $arr_int[$i];
                    $sign += $b * $w;
                }
                $n = $sign % 11;
                $val_num = $arr_ch[$n];
                if ($val_num != substr($id, 17, 1)) {
                    return FALSE;
                } else {
                    return TRUE;
                }
            }
        }
    }

    /**
     * 根据身份证信息获取年龄
     * @author woniu 20200330
     */
    if (!function_exists('idCardAge')) {
        function idCardAge($idcard = '')
        {
            if (empty($idcard)) return null;
            #  获得出生年月日的时间戳
            $date = strtotime(substr($idcard, 6, 8));
            #  获得今日的时间戳
            $today = strtotime('today');
            #  得到两个日期相差的大体年数
            $diff = floor(($today - $date) / 86400 / 365);
            #  strtotime加上这个年数后得到那日的时间戳后与今日的时间戳相比
            $age = strtotime(substr($idcard, 6, 8) . ' +' . $diff . 'years') > $today ? ($diff + 1) : $diff;
            return $age;
        }
    }
    
    /**
     * 判断是否是微信端
     */
    if (!function_exists('isWeixin')) {
        function isWeixin()
        {
            if (strpos(Yii::$app->request->userAgent, 'MicroMessenger') !== false) {
                return true;
            }
            return false;
        }
    }

    /**
     * 二维数组根据某个字段去重 可计算去重字段的数量
     * @param array $array 二维数组
     * @para array  去重后的数组
     */
    if (!function_exists('uniquArr')) {
        function uniquArr($array, $str1, $num = 'no')
        {
            $result = array();
            foreach ($array as $k => $val) {
                $code = false;
                foreach ($result as $_val) {
                    if ($_val[$str1] == $val[$str1]) {
                        $code = true;
                        break;
                    }
                }
                if (!$code) {
                    $result[] = $val;
                }
            }
            return $result;
        }
    }

    /**
     * 截取中文字符
     * @param type $var
     */
    if (!function_exists('msubstr')) {
        function msubstr($str, $start = 0, $length, $charset = "utf-8", $suffix = false)
        {
            if (function_exists("mb_substr")) {
                if ($suffix)
                    return mb_substr($str, $start, $length, $charset) . "...";
                else
                    return mb_substr($str, $start, $length, $charset);
            } elseif (function_exists('iconv_substr')) {
                if ($suffix)
                    return iconv_substr($str, $start, $length, $charset) . "...";
                else
                    return iconv_substr($str, $start, $length, $charset);
            }
            $re['utf-8'] = "/[x01-x7f]|[xc2-xdf][x80-xbf]|[xe0-xef][x80-xbf]{2}|[xf0-xff][x80-xbf]{3}/";
            $re['gb2312'] = "/[x01-x7f]|[xb0-xf7][xa0-xfe]/";
            $re['gbk'] = "/[x01-x7f]|[x81-xfe][x40-xfe]/";
            $re['big5'] = "/[x01-x7f]|[x81-xfe]([x40-x7e]|xa1-xfe])/";
            preg_match_all($re[$charset], $str, $match);
            $slice = join("", array_slice($match[0], $start, $length));
            if ($suffix) return $slice . "…";
            return $slice;
        }
    }

    /**
     * 获取配置文件
     * @param string $filename
     * @author syy
     * @date 2020.7.22
     */
    if (!function_exists('loadConfig')) {
        function loadConfig($filename)
        {
            return require \Yii::getAlias('@common') . '/config/' . $filename . 'php';
        }
    }

    /**
     * 获取邮箱格式正则，对邮箱后缀进行强校验
     */
    if (!function_exists('getEmailReg')) {
        function getEmailReg()
        {
            return "/^([a-zA-Z0-9_-]{1,})(\.[a-zA-Z0-9_-]{1,})*@([a-zA-Z0-9_-]{1,})(\.[a-zA-Z0-9_-]{1,}){0,3}(\.(?:com|net|org|edu|gov|mil|cn|us)){1,4}$/";
        }
    }

    /**
     * 截取字符串,带中文,多余的省略号代替
     * @author syy
     * @date 2020.8.3
     */
    if (!function_exists('subtext')) {

        function subtext($text, $length)
        {
            if (mb_strlen($text, 'utf8') > $length) {
                return mb_substr($text, 0, $length, 'utf8') . '...';
            } else {
                return $text;
            }
        }
    }

    if (!function_exists('halt')) {
        function halt($content)
        {
            codecept_debug($content);
        }
    }
}

/**获取两个经纬度之间的距离
 * @param string $lat1 纬一
 * @param String $lng1 经一
 * @param String $lat2 纬二G
 * @param String $lng2 经二
 * @return float  返回两点之间的距离
 */
if (!function_exists('calc_distance')) {

    function calc_distance($lat1, $lng1, $lat2, $lng2)
    {
        /** 转换数据类型为 double */
        $lat1 = doubleval($lat1);
        $lng1 = doubleval($lng1);
        $lat2 = doubleval($lat2);
        $lng2 = doubleval($lng2);
        /** 以下算法是 Google 出来的，与大多数经纬度计算工具结果一致 */
        $theta = $lng1 - $lng2;
        $dist = sin(deg2rad($lat1)) * sin(deg2rad($lat2)) + cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($theta));
        $dist = acos($dist);
        $dist = rad2deg($dist);
        $miles = $dist * 60 * 1.1515;
        return round(($miles * 1.609344) * 1000, 2);
    }
}

/**获取两个经纬度之间的距离
 * @param string $lat1 纬一
 * @param String $lng1 经一
 * @param String $lat2 纬二
 * @param String $lng2 经二
 * @return float  返回两点之间的距离
 */
if (!function_exists('getDays')) {

    function getDays()
    {
        $j = date("t"); //获取当前月份bai天数
        $start_time = strtotime(date('Y-m-01')); //获取本du月第一天zhi时间戳dao
        $array = array();
        for ($i = 0; $i < $j; $i++) {
            $array[] = date('Y-m-d', $start_time + $i * 86400); //每隔一天赋值给数组
        }
        return $array;
    }
}

//中文字符串截取
if (!function_exists('subtext')) {
    function subtext($text, $length)
    {
        if (mb_strlen($text, 'utf8') > $length) {
            return mb_substr($text, 0, $length, 'utf8') . '...';
        } else {
            return $text;
        }

    }

}

/**
 * 响应成功
 */
if (!function_exists('responseSuccess')) {
    function responseSuccess($code = 200, $msg = '', $data = [])
    {
        $response = Yii::$app->getResponse();
        $response->format = Response::FORMAT_JSON;
        $response->data = ['code' => $code, 'msg' => $msg, 'data' => $data];
        return $response;
    }
}

/**
 * 响应失败
 */
if (!function_exists('responseError')) {
    function responseError($code = -1002, $msg = '', $data = [])
    {
        $response = Yii::$app->getResponse();
        $response->format = Response::FORMAT_JSON;
        $response->data = ['code' => $code, 'msg' => $msg, 'data' => $data];
        return $response;
    }
}

/*
* 通过设置ip来控制登陆
*/
if (!function_exists('ipLoginLImit')) {
    function ipLoginLimit()
    {
        if (getenv("HTTP_CLIENT_IP"))
            $ip = getenv("HTTP_CLIENT_IP");
        else if (getenv("HTTP_X_FORWARDED_FOR"))
            $ip = getenv("HTTP_X_FORWARDED_FOR");
        else if (getenv("REMOTE_ADDR"))
            $ip = getenv("REMOTE_ADDR");
        else $ip = "Unknow";

        $ALLOWED_IP = array('127.0.0.1', '1.192.243.*', '1.192.247.*', '1.192.242.*');
        $check_ip_arr = explode('.', $ip);//允许访问的ip
        //ip参数拆分成数组
        if (!in_array($ip, $ALLOWED_IP)) {
            $bl = false;
            foreach ($ALLOWED_IP as $val) {
                if (strpos($val, '*') !== false) {
                    //发现有*号替代符
                    $arr = array();
                    $arr = explode('.', $val);
                    $bl = true;
                    //用于记录循环检测中是否有匹配成功的
                    for ($i = 0; $i < 4; $i++) {
                        if ($arr[$i] != '*') {
                            //不等于* 就要进来检测，如果为*符号替代符就不检查
                            if ($arr[$i] != $check_ip_arr[$i]) {
                                $bl = false;
                                break;
                                //终止检查本个ip 继续检查下一个ip
                            }
                        }
                    }
                    //end for
                    if ($bl) {
                        //如果是true则终止匹配
                        break;
                    }
                }
            }
            //end foreach
            if (!$bl) {
                return 0;//测试
            }
            return 1;
        }
        return 1;
    }
}

/*
* Yii的错误转化字符串
*/
if (!function_exists('errorsConvertToString')) {
    function errorsConvertToString($errors)
    {
        $str = '';
        foreach ($errors as $value) {
            foreach ($value as $err) {
                $str .= $err . '<br />';
            }
        }
        return str_replace("<br />", "", $str);
    }
}
